<?php
/**
 * 分类管理模型
 */
class CategoryModel extends Model{
	//定义数据
	public $table = 'll_category';
	//定义输入验证
	public $validate = array(
		//验证提交分类名称不能为空
		array('cname', 'nonull', '分类名称不能为空 ', 2,3),
		//验证提交分类名称不能超过20个字符 
		array('cname', 'maxlen:20', '分类名称不能超过20个字符 ', 2,3),
		//验证分类标题长度 1 到 60 位 
		array('ctitle', 'maxlen:60', '分类名称不能超过60个字符 ', 2,3),
		//验证分类排序字段必须为数字
		array('csort', 'num:1,65535','排序字段必须为数字',2,3),
		//验证分类描述，表单为空的时候不用验证，第一个3代表不为空，如果填写一定要按照我的规则来：关键字不能少于10个字符
		array('ckeywords','minlen:10','分类关键字不能少于10个字符',3,3),
		//验证提交关键字不能超过255个字符
		array('ckeywords','maxlen:255','分类关键字不能超过255个字符',2,3),
		//验证分类描述，表单为空的时候不用验证，第一个3代表不为空，如果填写一定要按照我的规则来：描述不能少于10个字符
		array('cdes','minlen:9','分类描述不能少于9个字符',3,3),
		//验证提交分类描述不能超过255个字符
		array('cdes','maxlen:255','分类描述不能超过255个字符',2,3),
		//验证提交静态目录为1~20位只包含字母数字下划线
		array('htmldir','regexp:/^\w+$/i','静态目录为1~20位只包含字母数字下划线',2,3)
	
	);

	
/**
* 分类添加数据
*/
public function add_data(){
		//执行验证方法；
		if(!$this->create()) return false;
		//判断提交分类名是否与数据库的数据有重名关系
		//1.获得提交数据
		$cname = Q('post.cname');
//		p($cname);die;
		//2.和数据库里的名字对比,如果有相同的,提示文件名相同；
		//用数组形式获得数据更安全
		if($this->get_one_data(array('cname'=>$cname))){
			//提示提交的数据名已经存在
			$this->error = $cname . '分类已经存在';
			//分类已经存在，不执行添加；
			return false;
		}
		//返出数据提交到分类控制器
		return $this->add();
		
	}
	
	
/**
* 获得分类表里的所有数据
*/
public function get_all_data(){
	 	//分类排序的所有数据，赋值变量；
	 	$data = $this->order('csort ASC')->all();	
		//格式化树状的数据   Data::tree为固定方法 （手册87页）
		$data = Data::tree($data,'cname','cid','pid');
		//返出数据；
		return $data;
	 }
	 
/**
* 获得一条数据
*/
public function get_one_data($where=NULL,$field=NULL){
		//得到分类控制器里的参数，获得需要的数据，返出数据。
		return $this->where($where)->field($field)->find();
	}
	
	
/**
* 获得所有子集
*/
public function get_son_data($cid){
		//获得分类所有数据赋值
		$data = $this->all();
		//给get_son传递数据；
		return $this->get_son($data,$cid);
	}
	
/**
* 递归获得所有子集分类
*/
public function get_son($data,$cid){
		//赋值空数组
		$temp = array();
		//递归循环分类子级
		foreach ($data as $v) {
			//如果发现有当前子级还有子级
			if($v['pid'] == $cid){
				//赋值给当前数组
				$temp[] = $v['cid'];
				//递归循环；
				$temp = array_merge($temp,$this->get_son($data, $v['cid']));
			}
		}
		//返出数据给get_son_data获得所有子集；
		return $temp;
	}
	

/**
 * 分类删除
 */	
public function del_data($cid){
		//判断是否有子集
		$data = $this->where(array('pid'=>$cid))->find();
		
		//得出是否有子级。
		if($data){
			//如果当前数据有子级，提示先删除它的子级；
			$this->error = '请先删除该分类下面的子集';
			//如果当前数据有子级，不执行删除
			return false;
		}
		//获得删除条件，执行删除，返出数据给分类控制器
		return $this->where(array('cid'=>$cid))->delete();
	}
	

/**
 * 获得子级分类
 */
public function get_change_cate($cid){
		//通过分类控制器传递过来的参数获得子级，赋值变量
		$son = $this->get_son_data($cid);
		//获得获得当前子级，压入数组
		$son[] = $cid;
		//获得不是当前数据的其他数据；
		//'SLEECT * FROM hd_category WHERE cid not in (8,11)'
		$data = $this->get_all_data('cid not in(' . implode(',', $son) . ')');
		//返出数据给分类控制器
		return $data;
		
	}

/**
 * 修改
 */
public function update_data($where=NULL){
		// p($_POST);die;
		//执行修改验证
		if(!$this->create()) return false;
		// if(1==1){$this->error('123er');}
		//返出数据给分类控制器
		return $this->where($where)->save();
		//获得最后一条SQL
//		p($this->getLastSql());die;
	}
}
